package com.c2b.algorithm.leetcode.base;

/**
 * <a href="https://leetcode.cn/problems/longest-subarray-of-1s-after-deleting-one-element/">删掉一个元素以后全为 1 的最长子数组(Longest Subarray of 1's After Deleting One Element)</a>
 * <p>给你一个二进制数组 nums ，你需要从中删掉一个元素。</p>
 * <p>请你在删掉元素的结果数组中，返回最长的且只包含 1 的非空子数组的长度。</p>
 * <p>如果不存在这样的子数组，请返回 0 。</p>
 * <p>
 * <b>示例：</b>
 * <pre>
 * 示例 1：
 *      输入：nums = [1,1,0,1]
 *      输出：3
 *      解释：删掉位置 2 的数后，[1,1,1] 包含 3 个 1 。
 *
 * 示例 2：
 *      输入：nums = [0,1,1,1,0,1,1,0,1]
 *      输出：5
 *      解释：删掉位置 4 的数字后，[0,1,1,1,1,1,0,1] 的最长全 1 子数组为 [1,1,1,1,1] 。
 *
 * 示例 3：
 *      输入：nums = [1,1,1]
 *      输出：2
 *      解释：你必须要删除一个元素。
 * </pre>
 * </p>
 * <p>
 * <b>提示：</b>
 * <ul>
 *     <li>1 <= nums.length <= 10^5</li>
 *     <li>nums[i] 要么是 0 要么是 1 。</li>
 * </ul>
 * </p>
 *
 * @author c2b
 * @since 2023/11/10 14:33
 */
public class LC1493LongestSubarrayOfOnesAfterDeletingOneElement_M {

    static class Solution {

        public int longestSubarray(int[] nums) {
            int res = 0;
            // 如果没出现0，a,b记录的都是连续的1的个数。
            // 如果出现1次0，a记录的是移除该0后连续1的个数，b记录的是0后面连续1的个数
            int a = 0;
            int b = 0;
            for (int num : nums) {
                if (num == 1) {
                    ++a;
                    ++b;
                    res = Math.max(res, a);
                } else {
                    a = b;
                    b = 0;
                }
            }
            return res == nums.length ? res - 1 : res;
        }
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        //System.out.println(solution.longestSubarray(new int[]{1, 1, 0, 1}));
        //System.out.println(solution.longestSubarray(new int[]{0, 1, 1, 1, 0, 1, 1, 0, 1}));
        //System.out.println(solution.longestSubarray(new int[]{1, 1, 1}));
        System.out.println(solution.longestSubarray(new int[]{1,1,0,0,1,1,1,0,1}));
    }


}
